package com.yinhe.music.yhmusic.base;

import com.yinhe.music.type.person.BaseInfo;
import com.yinhe.music.yhmusic.constants.IConstants;
import com.yinhe.music.yhmusic.instrument.InstrumentBean;
import com.yinhe.music.yhmusic.model.AlbumInfo;
import com.yinhe.music.yhmusic.model.CommentList;
import com.yinhe.music.yhmusic.model.HomeInfo;
import com.yinhe.music.yhmusic.model.LangResp;
import com.yinhe.music.yhmusic.model.LoginInfo;
import com.yinhe.music.yhmusic.model.Music;
import com.yinhe.music.yhmusic.model.MvsInfo;
import com.yinhe.music.yhmusic.model.PayResultInfo;
import com.yinhe.music.yhmusic.model.ProductInfo;
import com.yinhe.music.yhmusic.model.RadioClassify;
import com.yinhe.music.yhmusic.model.RadioInfo;
import com.yinhe.music.yhmusic.model.RadioListInfo;
import com.yinhe.music.yhmusic.model.SearchInfo;
import com.yinhe.music.yhmusic.model.SingerList;
import com.yinhe.music.yhmusic.model.SongMenuList;
import com.yinhe.music.yhmusic.model.Tags;
import com.yinhe.music.yhmusic.model.UserContent;
import com.yinhe.music.yhmusic.model.UserInfo;
import com.yinhe.music.yhmusic.model.ValidCodeInfo;
import com.yinhe.music.yhmusic.network.response.Response;
import com.yinhe.music.yhmusic.pay.PayInfo;
import com.yinhe.music.yhmusic.personal.model.VipListInfo;
import com.yinhe.music.yhmusic.search.model.BriefSearchInfo;
import com.yinhe.music.yhmusic.search.model.HotSearchInfo;
import com.yinhe.music.yhmusic.share.ShareInfoResponse;

import io.reactivex.Completable;
import io.reactivex.Observable;
import okhttp3.MultipartBody;
import okhttp3.ResponseBody;
import retrofit2.http.Field;

/**
 * 基础model层接口
 *
 * @author 何晓华
 */
public interface IBaseModel {

    Observable<Response<BaseInfo>> feedBack(@Field("content") String content);

    /**
     * 乐器信息
     */
    Observable<Response<InstrumentBean.InstrumentListBean>> getInstrumentInfo(int instrumentId);

    /**
     * 获取用户内容
     *
     * @param userId   用户id
     * @param type     用户的歌单/电台 songMenu/radio
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     */
    Observable<Response<UserContent>> getUserContent(String userId, String type, int page, int pageSize);

    /**
     * 获取用户信息
     *
     * @param userId 用户id
     * @return 用户信息
     */
    Observable<Response<UserInfo>> getOtherUserInfo(String userId);

    /**
     * 视频信息
     *
     * @param id 视频id
     */
    Observable<Response<MvsInfo>> getMvInfo(int id);

    /**
     * 热门搜索
     */
    Observable<Response<HotSearchInfo>> getHotSearch();

    /**
     * 新歌列表
     *
     * @return {@link Music}
     */
    Observable<Response<Music>> getNewSongList();

    /**
     * 11.6 用户注册/充值密码
     *
     * @param type      register/password
     * @param phone     手机号
     * @param validCode 验证码
     * @param password  密码
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<LoginInfo>> setPassword(String type, String phone, String validCode, String password);

    /**
     * 11.5 检查验证码
     */
    Observable<Response<ValidCodeInfo>> checkValidCode(String validCode, String phone);


    /**
     * 14.5 会员/雪币列表
     *
     * @param type member/snowGold
     */
    Observable<Response<VipListInfo>> getProductsList(String type);

    /**
     * 14.2 购买查询
     *
     * @param orderNo 订单号
     */
    Observable<Response<ProductInfo>> getProductInfo(String orderNo, String id);


    /**
     * 14.2 查询支付状态
     *
     * @param orderNo 订单号
     */
    Observable<Response<PayResultInfo>> getPayResult(String orderNo);

    /**
     * 14.1 购买信息
     *
     * @param payType     支付方式：string（可选：alipay[支付宝支付]，wechat[微信支付]，snowGold[雪币支付]，member[会员免费支付]）
     * @param productType 物品类型：string（可选：member[会员]，song[歌曲]，snowGold[雪币]）
     * @param product     物品：购买的会员天数（int）、歌曲id（string）、雪币个数（int）
     */
    Observable<Response<PayInfo>> getPayInfo(String payType, String productType, String product);

    /**
     * 11.4  第三方登录
     *
     * @return {@link LoginInfo}
     */
    Observable<Response<LoginInfo>> thirdPartLogin(String unionid, String platformId, String platform, String nickname, String gender, String image);

    /**
     * 乐器列表
     */
    Observable<Response<InstrumentBean>> getInstrumentList();

    /**
     * 14.2 已购歌曲列表
     *
     * @return {@link Music}
     */
    Observable<Response<Music>> getBoughtMusicList();

    /**
     * 13.13 获取收藏歌手
     */
    Observable<Response<SingerList>> getCollectSinger(int curPage, int pageSize);

    /**
     * 13.13 获取收藏专辑
     */
    Observable<Response<AlbumInfo>> getCollectAlbum(int curPage, int pageSize);

    /**
     * 13.13 获取收藏Mv
     */
    Observable<Response<MvsInfo>> getCollectMovie(int curPage, int pageSize);

    /**
     * 13.13 获取我的电台
     */
    Observable<Response<RadioListInfo>> getMyRadio(int curPage, int pageSize);


    /**
     * 2.4 随心听类型
     *
     * @return {@link LangResp}
     */
    Observable<Response<LangResp>> getSongClassify();

    /**
     * 2.5 随心听歌曲
     *
     * @return {@link Music}
     */
    Observable<Response<Music>> getClassifySongs(int classify);

    /**
     * 10.1 搜索提示
     *
     * @param keyWords 搜索关键词
     * @return {@link BriefSearchInfo}
     */
    Observable<Response<BriefSearchInfo>> getSearchTips(String keyWords);

    /**
     * 2.1歌曲信息
     *
     * @param musicId 歌曲id
     * @return {@link Music}
     */
    Observable<Response<Music>> getMusicInfo(int musicId);

    /**
     * 2.2播放歌曲
     *
     * @param musicId 歌曲id
     * @param quality 音质类型：string（参数值可选： "SQ"为超高音质，"HQ"为高音质，"Common"为普通音质，可不填）
     * @return {@link Music}
     */
    Observable<Response<BaseInfo>> getMusicUrl(int musicId, String quality);

    /**
     * 2.3 下载歌曲（批量）
     *
     * @param idList  歌曲id列表：list（例如：[id1,id2,id3]）
     * @param quality 音质类型：string（参数值可选： "SQ"为超高音质，"HQ"为高音质，"Common"为普通音质，可不填）
     * @return {@link BaseInfo}
     */
    Observable<Response<BaseInfo>> batchDownload(String idList, String quality);

    /**
     * 歌单信息
     *
     * @param id 歌单id
     * @return {@link SongMenuList}
     */
    Observable<Response<SongMenuList>> getSongMenuInfo(int id);

    /**
     * 歌单列表
     *
     * @param page 当前页：int，默认为1
     * @param type 歌单列表显示方式：string（参数值可选： "recommend"为推荐，"new"为最新）
     * @return {@link SongMenuList}
     */
    Observable<Response<SongMenuList>> getSongMenuList(int page, int pageSize, String type);


    /**
     * 歌单中歌曲列表
     *
     * @param songType 歌曲分类{@link IConstants}
     * @param id       歌单id：int
     * @param page     当前页：int，默认为1
     * @return {@link Music}
     */
    Observable<Response<Music>> getMusicList(String songType, int id, String page, String pageSize);

    /**
     * 4.1专辑信息
     *
     * @param id 专辑id
     * @return {@link AlbumInfo}
     */
    Observable<Response<AlbumInfo>> getAlbumInfo(int id);

    /**
     * 4.2 专辑列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @return {@link AlbumInfo}
     */
    Observable<Response<AlbumInfo>> getAlbumList(int page,
                                                 int pageSize);

    /**
     * 4.3  专辑中歌曲列表
     *
     * @param page     当前页：int，默认为1
     * @param pageSize 每页显示数：int，默认为10，最大为100
     * @param id       专辑id
     * @return {@link AlbumInfo}
     */
    Observable<Response<AlbumInfo>> getAlbumMusic(int page,
                                                  int pageSize,
                                                  int id);

    /**
     * 6.1 歌手信息
     *
     * @param id 歌手id
     * @return {@link SingerList}
     */
    Observable<Response<SingerList>> getSingerInfo(int id);

    /**
     * 6.2 歌手列表
     *
     * @return {@link SingerList}
     */
    Observable<Response<SingerList>> getSingerList();

    /**
     * 6.3 歌手中专辑列表
     *
     * @param albumType
     * @param page      当前页：int，默认为1
     * @param pageSize  每页显示数：int，默认为10，最大为100
     * @param id        专辑id
     * @return {@link AlbumInfo}
     */
    Observable<Response<AlbumInfo>> getSingerAlbum(String albumType, int page, int pageSize, int id);

    /**
     * 6.4 歌手中视频列表
     *
     * @param movieType
     * @param page      当前页：int，默认为1
     * @param pageSize  每页显示数：int，默认为10，最大为100
     * @param id        视频id
     * @return {@link MvsInfo}
     */
    Observable<Response<MvsInfo>> getSingerMvs(String movieType, int page, int pageSize, int id);


    /**
     * 收藏歌单
     *
     * @param idList      歌单列表
     * @param radioIdList 电台id
     * @param collectType 批量收藏分类：songMenu\radio
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> batchCollection(String idList, String radioIdList, String collectType);

    /**
     * 取消收藏歌单
     *
     * @param idList      歌单列表
     * @param radioIdList
     * @param collectType 批量收藏分类：songMenu\radio
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> batchUnCollection(String idList, String radioIdList, String collectType);

    /**
     * 用户删除歌单
     *
     * @param idList 歌单id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> deleteUserSongMenu(String idList);

    /**
     * 用户创建歌单
     *
     * @param songMenuName 歌单名称
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> createUserSongMenu(String songMenuName);

    /**
     * 登录请求
     *
     * @param pNum     电话号码
     * @param password 密码
     * @return loginInfo 登录返回信息
     */
    Observable<Response<LoginInfo>> requestLogin(String pNum, String password);

    /**
     * 获取用户信息
     *
     * @return {@link UserInfo} 用户信息
     */
    Observable<Response<UserInfo>> reqUserInfo();

    /**
     * 首页推荐轮播
     *
     * @return {@link HomeInfo}
     */
    Observable<Response<HomeInfo>> getRecommendBanners();

    /**
     * 首页推荐歌曲
     *
     * @return {@link HomeInfo}
     */
    Observable<Response<HomeInfo>> getRecommendSongs(int curPage, int pageSize);

    /**
     * 首页推荐新歌
     *
     * @return {@link HomeInfo}
     */
    Observable<Response<HomeInfo>> getRecommendNewSongs(int curPage, int pageSize);

    /**
     * 首页推荐歌单
     *
     * @return {@link HomeInfo}
     */
    Observable<Response<HomeInfo>> getRecommendSongMenus(int curPage, int pageSize);

    /**
     * 首页推荐MV
     *
     * @return {@link HomeInfo}
     */
    Observable<Response<HomeInfo>> getRecommendMvs(int curPage, int pageSize);

    /**
     * 电台列表
     *
     * @param mPageSize       每页数量
     * @param mPage           页数
     * @param bannerNum       轮播图数量
     * @param radioClassifyId 电台列表类型
     * @param sort
     * @return {@link RadioInfo}
     */
    Observable<Response<RadioListInfo>> getRadioList(int mPageSize, int mPage, int bannerNum, int radioClassifyId, String sort);

    /**
     * 8.4 电台类别列表
     *
     * @param mPageSize 每页数量
     * @param mPage     页数
     * @return 电台分类
     */
    Observable<Response<RadioClassify>> getRadioClassify(int mPageSize, int mPage);

    /**
     * 8.1  电台信息
     *
     * @param id 电台id
     * @return {@link RadioListInfo}
     */
    Observable<Response<RadioListInfo>> getRadioInfo(int id);

    /**
     * 8.3  电台中电台节目列表
     *
     * @param id       电台id
     * @param pageSize 每页数量
     * @param page     页数
     * @return {@link RadioListInfo.RadioSongs}
     */
    Observable<Response<RadioListInfo>> getRadioSong(int id, int pageSize, int page);

    /**
     * 5.3 视频列表
     *
     * @param page       当前页：int，默认为1
     * @param pageSize   每页显示数：int，默认为10，最大为100
     * @param classifyId 视频列表显示方式
     * @return {@link MvsInfo}
     */
    Observable<Response<MvsInfo>> getMvList(int page, int pageSize, int classifyId);

    /**
     * 5.4 获取分类
     *
     * @param type 分类类型
     * @return {@link Tags}
     */
    Observable<Response<Tags>> getTags(String type);

    /**
     * 5.5 视频点赞
     *
     * @param mvId
     * @return {@link BaseInfo}
     */
    Observable<Response<BaseInfo>> mvLike(int mvId);

    /**
     * 5.6 视频取消点赞
     *
     * @param mvId
     * @return {@link BaseInfo}
     */
    Observable<Response<BaseInfo>> mvUnLike(int mvId);

    /**
     * 10.1 搜索列表
     *
     * @param page        当前页：int，默认为1
     * @param pageSize    每页显示数：int，默认为10，最大为100
     * @param keyWords    搜索关键词
     * @param messageList 定义搜索信息：list，可选["song","songMenu","album","singer","movie","radio"]
     * @return {@link SearchInfo}
     */
    Observable<Response<SearchInfo>> getSearchList(int page, int pageSize, String keyWords, String messageList);

    /**
     * 12.4 歌单中添加歌曲
     *
     * @param id         歌单id
     * @param songIdList 歌曲id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> addSongToUserSongMenu(int id, String songIdList);

    /**
     * 12.5 移除歌单中歌曲
     *
     * @param id         歌单id
     * @param songIdList 歌曲id列表
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> deleteUserSongMenuSong(int id, String songIdList);

    /**
     * 13.5 收藏单个
     *
     * @param id          歌手/专辑/视频 id
     * @param collectType singer/album/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> collect(int id, String collectType);

    /**
     * 13.6 取消单个收藏
     *
     * @param id          歌手/专辑/视频 id
     * @param collectType singer/album/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> unCollect(int id, String collectType);

    /**
     * 15.2 评论列表
     *
     * @param id          歌手/专辑/视频 id
     * @param commentType 评论类型 singer/song/radioSong
     * @param curPage     当前页
     * @param pageSize    每页数量
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<CommentList>> getCommentList(int id, String commentType, int curPage, int pageSize);

    /**
     * 15.3 发表评论
     *
     * @param id          歌手/专辑/视频 id
     * @param commentType 评论类型 singer/song/radioSong
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> comment(int id, String commentType, String content);

    /**
    * 修改用户头像
    * */
    Observable<ResponseBody> modifyUserImage(String url, MultipartBody.Part part);

    /**
     * 11.2 已登录用户编辑
     *
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> modifyInfo(String url, String nickName, String gender, String songMenuName);

    /**
     * 11.5 获取验证码
     *
     * @param phone 手机号
     * @param type  register/password 注册或者重设密码
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<BaseInfo>> getValidCode(String type, String phone);

    /**
     * 16.1 获取分享信息
     *
     * @param id        歌曲、电台歌曲、视频id
     * @param shareType song/radioSong/movie
     * @return 提示字符串，在客户端中将字符串显示出来即可
     */
    Observable<Response<ShareInfoResponse>> getShareInfo(int id, String shareType);
}
